home *** CD-ROM | disk | FTP | other *** search
/ The PC-SIG Library 10 / The PC-Sig Library - Shareware for the IBM PC and Compatibles (PC-SIG)(Tenth Edition Disks 1-2804)(1991).iso / PC_SIGCD / 20 / 3 / DISK2032.ZIP / MENUDEMO.C < prev    next >
C/C++ Source or Header  |  1990-09-01  |  17KB  |  594 lines

  1. /*--------------------------------------------------------------
  2.  *  File:           MENUDEMO.C
  3.  *  Description:    Demo the MPLUS Menu System.  See BMDEMO.C
  4.  *                  for a comparison of the old system to the
  5.  *                  new system.
  6.  *
  7.  *  Copyright 1990  Michael Yam
  8.  *-------------------------------------------------------------*/
  9.  
  10. #include <stdio.h>
  11. #include <graph.h>
  12. #include <math.h>
  13.  
  14. #include "gplus.h"
  15. #include "gscreen.h"
  16. #include "mouser.h"
  17. #include "mpmenu.h"
  18.  
  19. #define ESC     0x011B          /* scan & ascii code for ESC key */
  20.  
  21. int dummy(), exitfun();
  22. int memfun();
  23. int mres(), hres(), eres(), vres();
  24. int info(), demo1(), demo2();
  25.  
  26. void sinplot();
  27. void setaxis();
  28.  
  29. /*--------------------------------------------------------------
  30.  *  Initialize menu structures.
  31.  *-------------------------------------------------------------*/
  32.  
  33. /*      Titles for pull down menus.  Main menu bar done last because
  34.  *      of backward referencing.
  35.  */
  36.  
  37. struct MENU_ITEM m0m0[] =           /* main menu bar 0, pulldown menu 0 */
  38. {
  39.     "Save", dummy, NULL, 0, 0,       /* dummy entries can be marked */
  40.     "Load", dummy, NULL, 0, 0,       /*   with grey out */
  41.     "DOS",  dummy, NULL, 0, 0,
  42.     "Exit to System", exitfun, NULL, 0, 0,
  43.     NULL, NULL, NULL, 0,0,
  44. };
  45.  
  46. struct MENU_ITEM m0m1[] =           /* main menu bar 0, pulldown menu 1 */
  47. {
  48.     "Memory", memfun, NULL, 0, 0,
  49.     NULL, NULL, NULL, 0,0,
  50. };
  51.  
  52. struct MENU_ITEM m0m2[] = 
  53. {
  54.     "Medium Res 4 Color", mres, NULL, 0, 0,
  55.     "Hi Res Black & White", hres, NULL, 0, 0,
  56.     "EGA", eres, NULL, 0, 0,
  57.     "VGA", vres, NULL, 0, 0,
  58.     NULL, NULL, NULL, 0,0,
  59. };
  60.  
  61. struct MENU_ITEM m0m3[] = 
  62. {
  63.     "Info", info, NULL, 0, 0,
  64.     "Demo 1", demo1, NULL, 0, 0,
  65.     "Demo 2", demo2, NULL, 0, 0,
  66.     NULL, NULL, NULL, 0,0,
  67. };
  68.  
  69. /*      Titles for main menu goes last because of backward
  70.  *      referencing of pulldown menu structures.
  71.  *
  72.  *      Notation for submenus may appear a little weird but 
  73.  *      if you have lots of submenus and sub-submenus,
  74.  *      the notation will be useful in keeping track of them.
  75.  */
  76. struct MENU_ITEM menubar[] =
  77. {
  78.     "File", NULL, m0m0, 1, 0,       /* m0m0 = menu 0, pull down menu 0 */
  79.     "System", NULL, m0m1, 1, 0,     /* m0m1 = menu 0, pull down menu 1 */
  80.     "Video Mode", NULL, m0m2, 1, 0, /* m0m2 = menu 0, pull down menu 2 */
  81.     "Help", NULL, m0m3, 1, 0,       /* m0m3 = menu 0, pull down menu 3 */
  82.     NULL, NULL, NULL, 0,0,
  83. };
  84.     
  85. struct MENU_INFO menu_info = 
  86. {
  87.     ESC, exitfun,                           /* exit key & function */
  88.     BLACK, CYAN, RED, GREY,                 /* attr of bar menu */
  89.     _GBORDER, BLUE, WHITE, BLUE, GREY,      /* attr of pull down windows */
  90. };
  91.  
  92. extern struct videoconfig _videoconfig;
  93.  
  94. /*--------------------------------------------------------------
  95.  *  Function:       main
  96.  *  Description:    demos the bar menu.
  97.  *  Return value:   0 returned to parent process.
  98.  *--------------------------------------------------------------*/
  99. main()
  100. {
  101.     int ret;
  102.     int (*funptr)();
  103.     char ms_flag;
  104.  
  105.     /*      Try to set video mode to EGA
  106.      */
  107.     if( !mpsetvideomode( _ERESCOLOR ) )
  108.         if( !mpsetvideomode( _HRESBW ) )
  109.         {
  110.             printf("\nUnrecognized video hardware.\n");
  111.             exit(1);
  112.         }
  113.  
  114. #ifdef OLDCODE
  115.     bm_init( 1, 1, bmtitle, bftitle, funselect ); 
  116.     bm_exit( ESC, exitfun );        /* enable ESC to quit menu */
  117.     bm_show( BLACK, CYAN, RED );
  118. #endif
  119.  
  120.     /*      Open menu bar with colors defined in menu_info.
  121.      */
  122.     mb_open( 1, 1, 80, &menu_info, menubar );
  123.  
  124.     ms_flag = ms_reset();
  125.     ms_setevent(1);
  126.     ms_showcursor();
  127.  
  128.     if( ms_flag == 0 )
  129.     {
  130.         gdialog( GDINFORM, GDOKAY );
  131.         gdwrite( "No mouse detected but keyboard is\n" );
  132.         gdwrite( "supported.  Press \"O\" to quit dialogue\n");
  133.         gdwrite( "box, then press ALT+first letter of\n");
  134.         gdwrite( "menu title.  See chapter 6.\n");
  135.         gdprompt();
  136.         gdclose();
  137.     }
  138.  
  139.     funptr = NULL;
  140.  
  141.     while( funptr != exitfun || ret != 0)
  142.     {
  143.         funptr = mb_run();
  144.         if ( funptr != NULL)
  145.             ret = funptr();             /* execute selected function */
  146.     }
  147.     mb_close();
  148.     ms_setevent(0);
  149.     mpsetvideomode( _DEFAULTMODE );
  150.     return 0;
  151. }
  152. /*--------------------------------------------------------------
  153.  *  Function:       dummy
  154.  *  Description:    Dummy function to invoke from bar menu
  155.  *  Return value:   0
  156.  *--------------------------------------------------------------*/
  157. int dummy()
  158. {
  159.     gdialog( GDINFORM, GDOKAY );
  160.     gdwrite("Function not available.");
  161.     gdprompt();
  162.     gdclose();
  163.     return 0;
  164. }
  165. /*--------------------------------------------------------------
  166.  *  Function:       exitfun
  167.  *  Description:    quit this program
  168.  *  Return value:   0
  169.  *--------------------------------------------------------------*/
  170. int exitfun()
  171. {
  172.     int i;
  173.  
  174.     gdialog( GDWARN, GDYESNO );
  175.     gdwrite( "Quit bar menu demo?");
  176.     i = gdprompt();
  177.     gdclose();
  178.  
  179.     return i;
  180. }
  181. /*--------------------------------------------------------------
  182.  *  Function:       memfun
  183.  *  Description:    Display memory info to dialog box
  184.  *  Return value:   0
  185.  *--------------------------------------------------------------*/
  186. int memfun()
  187. {
  188.     char buffer[41];
  189.  
  190.     gdialog( GDINFORM, GDOKAY );
  191.  
  192.     sprintf( buffer, "Memory available: %u bytes\n", _memavl() );
  193.     gdwrite( buffer );
  194.     sprintf( buffer, "Max contiguous block: %u bytes\n", _memmax() );
  195.     gdwrite( buffer );
  196.  
  197.     gdprompt();
  198.     gdclose();
  199.  
  200.     return 0;
  201. }
  202. /*--------------------------------------------------------------
  203.  *  Function:       mres
  204.  *  Description:    Set the screen to medium resolution, 4 color
  205.  *  Return value:   0
  206.  *--------------------------------------------------------------*/
  207. int mres()
  208. {
  209.     char buffer[41];
  210.     int i;
  211.  
  212.     gdialog( GDINFORM, GDOKCAN );
  213.     gdwrite( "Reset mode to four color,\nmedium resolution?" );
  214.     i = gdprompt();
  215.     gdclose();
  216.  
  217.     if( i == 0 )
  218.     {
  219.         mb_close();
  220.         if( mpsetvideomode( _MRES4COLOR ) == 0 )
  221.         {
  222.             gdialog( GDERROR, GDOKAY );
  223.             gdwrite( "Video mode not supported by hardware." );
  224.             gdprompt();
  225.             gdclose();
  226.         }
  227.         else
  228.         {
  229.             /*      Select colors for palette 1
  230.              */
  231.             _selectpalette(1);
  232.  
  233.             menu_info.fg0 = 0x01;       /* cyan */
  234.             menu_info.bg0 = 0x02;       /* magenta */
  235.             menu_info.keycolor0 = 0x03; /* light grey */
  236.  
  237.             menu_info.fg = 0x01;        /* cyan */
  238.             menu_info.bg = 0x03;        /* light grey */
  239.             menu_info.keycolor = 0x01;
  240.  
  241.             menu_info.greyout0 = menu_info.greyout = 0x03;
  242.             mb_open( 1, 1, 80, &menu_info, menubar );
  243.             ms_showcursor();
  244.         }
  245.     }
  246.     
  247.     return 0;
  248. }
  249. /*--------------------------------------------------------------
  250.  *  Function:       hres
  251.  *  Description:    Set the screen to black and white hi res
  252.  *  Return value:   0
  253.  *--------------------------------------------------------------*/
  254. int hres()
  255. {
  256.     char buffer[41];
  257.     int i;
  258.  
  259.     gdialog( GDINFORM, GDOKCAN );
  260.     gdwrite( "Reset mode to black and white,\nhigh resolution?" );
  261.     i = gdprompt();
  262.     gdclose();
  263.  
  264.     if( i == 0 )
  265.     {
  266.         mb_close();
  267.         if( mpsetvideomode( _HRESBW ) == 0 )
  268.         {
  269.             gdialog( GDERROR, GDOKAY );
  270.             gdwrite( "Video mode not supported by hardware." );
  271.             gdprompt();
  272.             gdclose();
  273.         }
  274.         else
  275.         {
  276.             /*      Reset colors to black and white.
  277.              */
  278.             menu_info.fg0 = menu_info.fg = 0x00;
  279.             menu_info.bg0 = menu_info.bg = 0x07;
  280.             menu_info.keycolor0 = menu_info.keycolor = 0x07;
  281.             menu_info.greyout0 = menu_info.greyout = 0x07;
  282.             mb_open (1,1,80, &menu_info, menubar);
  283.  
  284.             ms_showcursor();
  285.         }
  286.     }
  287.     
  288.     return 0;
  289. }
  290. /*--------------------------------------------------------------
  291.  *  Function:       eres
  292.  *  Description:    Set the screen to ega, 16 color
  293.  *  Return value:   0
  294.  *--------------------------------------------------------------*/
  295. int eres()
  296. {
  297.     char buffer[41];
  298.     int i;
  299.  
  300.     gdialog( GDINFORM, GDOKCAN );
  301.     gdwrite( "Reset mode to ega color?" );
  302.     i = gdprompt();
  303.     gdclose();
  304.  
  305.     if( i == 0 )
  306.     {
  307.         /*      Microsoft is weird.  If we go from VGA to EGA, we get
  308.          *      43 line EGA.  Avoid this by going thru another graphics mode.
  309.          */
  310.         mb_close();
  311.         mpsetvideomode( _MRES4COLOR );
  312.         if( mpsetvideomode( _ERESCOLOR ) == 0 )
  313.         {
  314.             gdialog( GDERROR, GDOKAY );
  315.             gdwrite( "Video mode not supported by hardware." );
  316.             gdprompt();
  317.             gdclose();
  318.         }
  319.         else
  320.         {
  321.             menucolors( &menu_info );
  322.             mb_open (1,1,80, &menu_info, menubar);
  323.             ms_showcursor();
  324.         }
  325.     }
  326.     return 0;
  327. }
  328. /*--------------------------------------------------------------
  329.  *  Function:       vres
  330.  *  Description:    Set the screen to vga res 
  331.  *  Return value:   0
  332.  *--------------------------------------------------------------*/
  333. int vres()
  334. {
  335.     char buffer[41];
  336.     int i;
  337.  
  338.     gdialog( GDINFORM, GDOKCAN );
  339.     gdwrite( "Reset mode to vga color?" );
  340.     i = gdprompt();
  341.     gdclose();
  342.  
  343.     if( i == 0 )
  344.     {
  345.         mb_close();
  346.         if( mpsetvideomode( _VRES16COLOR ) == 0 )
  347.         {
  348.             gdialog( GDERROR, GDOKAY );
  349.             gdwrite( "Video mode not supported by hardware." );
  350.             gdprompt();
  351.             gdclose();
  352.         }
  353.         else
  354.         {
  355.             menucolors( &menu_info );
  356.             mb_open (1,1,80, &menu_info, menubar);
  357.             ms_showcursor();
  358.         }
  359.     }
  360.     
  361.     return 0;
  362. }
  363. /*--------------------------------------------------------------
  364.  *  Function:       info
  365.  *  Description:    info function invoked from bar menu
  366.  *  Return value:   0
  367.  *--------------------------------------------------------------*/
  368. int info()
  369. {
  370.     int device;
  371.     int ch;
  372.     struct ms_status ms_status;
  373.     GWDW *gwptr;
  374.  
  375.     if( _videoconfig.numtextcols <= 40 )
  376.     {
  377.         gdialog( GDINFORM, GDOKAY );
  378.         gdwrite( "Please change to\n");
  379.         gdwrite( "hi-res mode to\n");
  380.         gdwrite( "view info." );
  381.         gdprompt();
  382.         gdclose();
  383.         return 0;
  384.     }
  385.  
  386.     gwptr = gwdwtopen( 5, 10, 19, 65, _GBORDER, BRIGHTWHITE, GREEN );
  387.     if( (char *)gwptr == NULL )
  388.     {
  389.         gdialog( GDWARN, GDOKAY );
  390.         gdwrite( "Insufficient memory.\n");
  391.         gdwrite( "Set video mode to B/W Hi-res and\n");
  392.         gdwrite( "try again." );
  393.         gdprompt();
  394.         gdclose();
  395.         return 0;
  396.     }
  397.     outtext("         The MPLUS Graphic Interface Library\n", LIGHTYELLOW, -1);
  398.     outtext("         Copyright 1989, 1990 by Michael Yam\n\n", LIGHTYELLOW, -1 );
  399.     outtext("MPLUS is a user supported program.  If you find this\n", BRIGHTWHITE, -1);
  400.     outtext("package useful, please register your copy by sending\n", BRIGHTWHITE, -1);
  401.     outtext("fifty dollars ($50) to:\n\n", BRIGHTWHITE, -1 );
  402.     outtext("     Michael Yam\n", BRIGHTWHITE, -1 );
  403.     outtext("     230 East 88th St.  #6B\n", BRIGHTWHITE, -1 );
  404.     outtext("     New York, NY  10128\n\n", BRIGHTWHITE, -1 );
  405.     outtext("Thank you for your support!   ", BRIGHTWHITE, -1 );
  406.     outtext("Press a key...", BLACK, -1 );
  407.     while(1)
  408.     {
  409.         device = dev_ready( &ch, &ms_status );
  410.         if( device == _KB )
  411.         {
  412.             if( ch != 0 )
  413.                 break;
  414.         }
  415.         if( device == _MS )
  416.         {
  417.             if( ms_status.rbtn || ms_status.lbtn )
  418.                 break;
  419.         }
  420.     }
  421.     gwdwclose( gwptr );
  422.     return 0;
  423. }
  424. /*--------------------------------------------------------------
  425.  *  Function:       demo1
  426.  *  Description:    plot a sine wave
  427.  *  Return value:   0
  428.  *--------------------------------------------------------------*/
  429. int demo1()
  430. {
  431.     extern struct videoconfig _videoconfig;
  432.  
  433.     short fg, bg, highlite;
  434.     int ch;
  435.     int device;
  436.     double pi;
  437.     struct ms_status ms_status;
  438.     GWDW *gwptr1, *gwptr2;
  439.  
  440.     /*      Although MPLUS is geared for EGA and VGA modes, try to
  441.      *      accomodate low res graphics.
  442.      */
  443.     if( _videoconfig.mode == _MRES4COLOR )
  444.     {
  445.         _selectpalette(1);
  446.         fg = 1;
  447.         bg = 2;
  448.         highlite = 3;
  449.     }
  450.     else if( _videoconfig.mode == _HRESBW )
  451.     {
  452.         fg = 7;
  453.         bg = 0;
  454.         highlite = 7;
  455.     }
  456.     else
  457.     {
  458.         fg = MAGENTA;
  459.         bg = LIGHTYELLOW;
  460.         highlite = BLUE;
  461.     }
  462.  
  463.     pi = 3.141592654;
  464.     gwptr1 = gwdwopen( 20, 20, 300, 150, _GBORDER, fg, bg );
  465.     _setcolor( highlite );
  466.     setaxis( gwptr1 );
  467.     sinplot( -2*pi, 2*pi, 280, 50 );
  468.  
  469.     gwptr2 = gwdwtopen( 22, 1, 24, 40, _GFILLINTERIOR, bg, fg );
  470.     outtext( "Press a key or mouse button...", highlite, -1 );
  471.  
  472.     while (1)
  473.     {
  474.         /*      Wait for keystroke or mouse buttons.
  475.          */
  476.         device = dev_ready( &ch, &ms_status );
  477.         if( device == _MS )
  478.         {
  479.             if( ms_status.lbtn || ms_status.rbtn )
  480.                 break;
  481.         }
  482.         else if( device == _KB )
  483.         {
  484.             if( ch != 0 )
  485.                 break;
  486.         }
  487.     }
  488.     gwdwclose( gwptr2 );
  489.     gwdwclose( gwptr1 );
  490.     return 0;
  491. }
  492. /*--------------------------------------------------------------
  493.  *  Function:       sinplot
  494.  *  Description:    plot a sine wave
  495.  *  Return value:   none
  496.  *--------------------------------------------------------------*/
  497. void sinplot( range1, range2, xpixels, ysf )
  498. double range1;
  499. double range2;
  500. short xpixels;                  /* x pixels available */
  501. int ysf;                        /* y scale factor */
  502. {
  503.     int i;
  504.     int cursor;
  505.     double numperxpix;
  506.     double xpixpernum;
  507.     double x, y;
  508.  
  509.     cursor = ms_cursor();
  510.     ms_hidecursor();
  511.     numperxpix = (fabs(range2-range1))/(double)xpixels;
  512.     xpixpernum = 1/numperxpix;
  513.  
  514.     /*      Calculate first point.  Position cursor with _moveto.
  515.      *      Adjust sign for y axis.
  516.      */
  517.     x = range1;
  518.     y = sin( x );
  519.     _moveto( (short)(range1/numperxpix), (short)(-( y*ysf )) );
  520.  
  521.     for( i=1; i<xpixels; ++i)
  522.     {
  523.         x += numperxpix;
  524.         y = sin( x );
  525.         _lineto( (short)(x * xpixpernum), (short)(-(y*ysf)) );
  526.     }
  527.     if( cursor )
  528.         ms_showcursor();
  529. }
  530. /*--------------------------------------------------------------
  531.  *  Function:       setaxis
  532.  *  Description:    draw axis and set logical origin to center
  533.  *                  of screen.
  534.  *  Return value:   none
  535.  *--------------------------------------------------------------*/
  536. void setaxis( gwptr )
  537. GWDW *gwptr;
  538. {
  539.     int cursor;
  540.     short xctr, yctr;
  541.  
  542.     cursor = ms_cursor();
  543.     ms_hidecursor();
  544.     xctr = (gwptr->x2-gwptr->x1)/2;
  545.     yctr = (gwptr->y2-gwptr->y1)/2;
  546.  
  547.     _moveto( xctr, 0 );
  548.     _lineto( xctr, gwptr->y2-gwptr->y1 );
  549.     _moveto( 0, yctr );
  550.     _lineto( gwptr->x2-gwptr->x1, yctr );
  551.  
  552.     gwdwsetorg( gwptr, xctr, yctr );
  553.     if( cursor )
  554.         ms_showcursor();
  555. }
  556. /*--------------------------------------------------------------
  557.  *  Function:       demo2
  558.  *  Description:    
  559.  *  Return value:   0
  560.  *--------------------------------------------------------------*/
  561. int demo2()
  562. {
  563.     gdialog( GDINFORM, GDOKAY );
  564.     gdwrite("This is it.");
  565.     gdprompt();
  566.     gdclose();
  567.  
  568.     return 0;
  569. }
  570. /*--------------------------------------------------------------
  571.  *  Function:       menucolors
  572.  *  Description:    Set MENU_INFO struct with standard colors.
  573.  *                  For EGA & VGA modes.  See also mb_stdcolors()
  574.  *                  in manual.
  575.  *  Return value:   0
  576.  *--------------------------------------------------------------*/
  577. int menucolors(menu_info)
  578. struct MENU_INFO *menu_info;
  579. {
  580.     menu_info->fg0 = BLACK;
  581.     menu_info->bg0 = CYAN;
  582.     menu_info->keycolor0 = RED;
  583.     menu_info->greyout0 = GREY;
  584.     menu_info->border = _GBORDER;
  585.     menu_info->fg = BLUE;
  586.     menu_info->bg = WHITE;
  587.     menu_info->keycolor = BLUE;
  588.     menu_info->greyout = GREY;
  589.     return 0;
  590. }
  591. /*-------------------------------------------------------------*
  592.  *                      End of MENUDEMO.C                      *
  593.  *-------------------------------------------------------------*/
  594.